package pare.servidor.rn;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import pare.common.so.SO_RemoteObserver;
import pare.servidor.so.SO_ServidorRMI;

public class RN_Servidor {
	private SO_ServidorRMI servidorRMI;
	private SO_RemoteObserver observadorFantasma;
	
	private static RN_Servidor instancia;
	
	private List<String> listaEspera = new ArrayList<String>();
	private List<SO_RemoteObserver> listaCliente = new ArrayList<SO_RemoteObserver>();
	private List<String> todosJogadores = new ArrayList<String>();
	
	private RN_Servidor() {
		try {
			servidorRMI = new SO_ServidorRMI();
		} catch (RemoteException re) {
			re.printStackTrace();
		}
	}
	
	public static RN_Servidor getInstance(){
		if(instancia == null)
			instancia = new RN_Servidor();
		return instancia;
	}
	
	public void conectaJogador(String jogador, SO_RemoteObserver observer) throws RemoteException {
		todosJogadores.add(jogador);
		if(RN_Sala.getInstance().getSalaEstado() == true){
			observer.update("moveJogo");
		}
		else {
			listaEspera.add(jogador);
			listaCliente.add(observer);
			observer.update("iniciaEspera");
			servidorRMI.notificaObservadores("atualizaEspera");
		}
	}
	
	/*public void desconectaTodos() throws RemoteException {
		//RN_Sala.getInstance().getListaSala().add("JogadorFantasma");
		//RN_Sala.getInstance().getListaCliente().add(observadorFantasma);
		for(int i = listaCliente.size() - 1; i >= 0; i--) {
			String jogador = RN_Sala.getInstance().getListaSala().remove(i);
			SO_RemoteObserver observador = RN_Sala.getInstance().getListaCliente().remove(i);
			RN_ServidorJogo.getInstance().getListaEspera().add(jogador);
			RN_ServidorJogo.getInstance().getListaCliente().add(observador);
			RN_ServidorJogo.getInstance().getServidorRMI().registraObservador(observador);
			RN_ServidorJogo.getInstance().getServidorRMI().notificaObservadores("atualizaEspera");
		}
		//RN_Sala.getInstance().getSalaJogo().removeTodos();
	}*/
	
	public void iniciaServidor() {
		servidorRMI.iniciaServidor();
	}
	
	public void finalizaServidor() {
		servidorRMI.finalizaServidor();
	}

	public List<String> getListaEspera() {
		return listaEspera;
	}
	
	public void setServidorRMI(SO_ServidorRMI servidorRMI){
		this.servidorRMI = servidorRMI;
	}
	
	public SO_ServidorRMI getServidorRMI(){
		return this.servidorRMI;
	}

	public List<SO_RemoteObserver> getListaCliente() {
		return listaCliente;
	}

	public void desconectaJogador(String jogador, SO_RemoteObserver observer) throws RemoteException{
		if(listaCliente.contains(observer)){
			listaEspera.remove(listaCliente.indexOf(observer));
			listaCliente.remove(observer);
			servidorRMI.removeObservador(observer);
			servidorRMI.notificaObservadores("atualizaEspera");
		}
	}
	
	public List<String> getTodosJogadores() throws RemoteException {
		return this.todosJogadores;
	}
	
	public void clear() {
		instancia = null;
	}
	
	//Main -------------------------------------------------------------
	public static void main(String[] args) {
		RN_Servidor.getInstance().clear();
		RN_Sala.getInstance().clear();
		RN_Servidor.getInstance().iniciaServidor();
		RN_Sala.getInstance().iniciaSala();
	}
}
